home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / mesa / mesa-tk / samples.tk / font.c < prev    next >
C/C++ Source or Header  |  2000-02-23  |  6KB  |  277 lines

  1. /*
  2.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or
  9.  * publicity relating to the software without the specific, prior written
  10.  * permission of Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND,
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include "gltk.h"
  29.  
  30. #define OPENGL_WIDTH 24
  31. #define OPENGL_HEIGHT 13
  32.  
  33. char string[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz";
  34. GLenum rgb, doubleBuffer, directRender, windType;
  35. GLuint strokeBase, outlineBase, filledBase, bitmapBase;
  36. float angleX = 0.0, angleY = 0.0, angleZ = 0.0;
  37. float scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0;
  38. float shiftX = 0.0, shiftY = 0.0, shiftZ = 0.0;
  39.  
  40. static void Init(void)
  41. {
  42.  
  43.   strokeBase = glGenLists(256);
  44.   if (tkCreateStrokeFont(strokeBase) == GL_FALSE) {
  45.     tkQuit();
  46.   }
  47.   outlineBase = glGenLists(256);
  48.   if (tkCreateOutlineFont(outlineBase) == GL_FALSE) {
  49.     tkQuit();
  50.   }
  51.   filledBase = glGenLists(256);
  52.   if (tkCreateFilledFont(filledBase) == GL_FALSE) {
  53.     tkQuit();
  54.   }
  55.   bitmapBase = glGenLists(256);
  56.   if (tkCreateBitmapFont(bitmapBase) == GL_FALSE) {
  57.     tkQuit();
  58.   }
  59.  
  60.   glClearColor(0.0, 0.0, 0.0, 0.0);
  61.   glClearIndex(0.0);
  62. }
  63.  
  64. static void Reshape(int width, int height)
  65. {
  66.  
  67.   glViewport(0, 0, (GLint) width, (GLint) height);
  68.  
  69.   glMatrixMode(GL_PROJECTION);
  70.   glLoadIdentity();
  71.   glOrtho(-400.0, 400.0, -200.0, 200.0, -400.0, 400.0);
  72.   glMatrixMode(GL_MODELVIEW);
  73. }
  74.  
  75. static GLenum Key(int key, GLenum mask)
  76. {
  77.  
  78.   switch (key) {
  79.     case TK_ESCAPE:
  80.       tkQuit();
  81.  
  82.     case TK_LEFT:
  83.       shiftX -= 20.0;
  84.       break;
  85.     case TK_RIGHT:
  86.       shiftX += 20.0;
  87.       break;
  88.     case TK_UP:
  89.       shiftY += 20.0;
  90.       break;
  91.     case TK_DOWN:
  92.       shiftY -= 20.0;
  93.       break;
  94.     case TK_n:
  95.       shiftZ += 20.0;
  96.       break;
  97.     case TK_m:
  98.       shiftZ -= 20.0;
  99.       break;
  100.  
  101.     case TK_q:
  102.       scaleX -= 0.1;
  103.       if (scaleX < 0.1) {
  104.     scaleX = 0.1;
  105.       }
  106.       break;
  107.     case TK_w:
  108.       scaleX += 0.1;
  109.       break;
  110.     case TK_a:
  111.       scaleY -= 0.1;
  112.       if (scaleY < 0.1) {
  113.     scaleY = 0.1;
  114.       }
  115.       break;
  116.     case TK_s:
  117.       scaleY += 0.1;
  118.       break;
  119.     case TK_z:
  120.       scaleZ -= 0.1;
  121.       if (scaleZ < 0.1) {
  122.     scaleZ = 0.1;
  123.       }
  124.       break;
  125.     case TK_x:
  126.       scaleZ += 0.1;
  127.       break;
  128.  
  129.     case TK_e:
  130.       angleX -= 5.0;
  131.       if (angleX < 0.0) {
  132.     angleX = 360.0 + angleX;
  133.       }
  134.       break;
  135.     case TK_r:
  136.       angleX += 5.0;
  137.       if (angleX > 360.0) {
  138.     angleX = angleX - 360.0;
  139.       }
  140.       break;
  141.     case TK_d:
  142.       angleY -= 5.0;
  143.       if (angleY < 0.0) {
  144.     angleY = 360.0 + angleY;
  145.       }
  146.       break;
  147.     case TK_f:
  148.       angleY += 5.0;
  149.       if (angleY > 360.0) {
  150.     angleY = angleY - 360.0;
  151.       }
  152.       break;
  153.     case TK_c:
  154.       angleZ -= 5.0;
  155.       if (angleZ < 0.0) {
  156.     angleZ = 360.0 + angleZ;
  157.       }
  158.       break;
  159.     case TK_v:
  160.       angleZ += 5.0;
  161.       if (angleZ > 360.0) {
  162.     angleZ = angleZ - 360.0;
  163.       }
  164.       break;
  165.  
  166.     default:
  167.       return GL_FALSE;
  168.   }
  169.   return GL_TRUE;
  170. }
  171.  
  172. static void Draw(void)
  173. {
  174.  
  175.   glClear(GL_COLOR_BUFFER_BIT);
  176.  
  177.   TK_SETCOLOR(windType, TK_WHITE);
  178.  
  179.   glPushMatrix();
  180.  
  181.   glTranslatef(shiftX, shiftY, shiftZ);
  182.   glRotatef(angleX, 1.0, 0.0, 0.0);
  183.   glRotatef(angleY, 0.0, 1.0, 0.0);
  184.   glRotatef(angleZ, 0.0, 0.0, 1.0);
  185.   glScalef(scaleX, scaleY, scaleZ);
  186.  
  187.   glPushMatrix();
  188.   glRasterPos2f(-390.5, 0.5);
  189.   tkDrawStr(bitmapBase, string);
  190.   glPopMatrix();
  191.  
  192.   glPushMatrix();
  193.   glTranslatef(-390.5, -30.5, 0.0);
  194.   tkDrawStr(strokeBase, string);
  195.   glPopMatrix();
  196.  
  197.   glPushMatrix();
  198.   glTranslatef(-390.5, -60.5, 0.0);
  199.   tkDrawStr(outlineBase, string);
  200.   glPopMatrix();
  201.  
  202.   glPushMatrix();
  203.   glTranslatef(-390.5, -90.5, 0.0);
  204.   tkDrawStr(filledBase, string);
  205.   glPopMatrix();
  206.  
  207.   glPopMatrix();
  208.  
  209.   glFlush();
  210.  
  211.   if (doubleBuffer) {
  212.     tkSwapBuffers();
  213.   }
  214. }
  215.  
  216. static GLenum Args(int argc, char **argv)
  217. {
  218.   GLint i;
  219.  
  220.   rgb = GL_TRUE;
  221.   doubleBuffer = GL_FALSE;
  222.   directRender = GL_TRUE;
  223.  
  224.   for (i = 1; i < argc; i++) {
  225.     if (strcmp(argv[i], "-ci") == 0) {
  226.       rgb = GL_FALSE;
  227.     }
  228.     else if (strcmp(argv[i], "-rgb") == 0) {
  229.       rgb = GL_TRUE;
  230.     }
  231.     else if (strcmp(argv[i], "-sb") == 0) {
  232.       doubleBuffer = GL_FALSE;
  233.     }
  234.     else if (strcmp(argv[i], "-db") == 0) {
  235.       doubleBuffer = GL_TRUE;
  236.     }
  237.     else if (strcmp(argv[i], "-dr") == 0) {
  238.       directRender = GL_TRUE;
  239.     }
  240.     else if (strcmp(argv[i], "-ir") == 0) {
  241.       directRender = GL_FALSE;
  242.     }
  243.     else {
  244.       printf("%s (Bad option).\n", argv[i]);
  245.       return GL_FALSE;
  246.     }
  247.   }
  248.   return GL_TRUE;
  249. }
  250.  
  251. void main(int argc, char **argv)
  252. {
  253.  
  254.   if (Args(argc, argv) == GL_FALSE) {
  255.     tkQuit();
  256.   }
  257.  
  258.   tkInitPosition(0, 0, 800, 400);
  259.  
  260.   windType = (rgb) ? TK_RGB : TK_INDEX;
  261.   windType |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  262.   windType |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  263.   tkInitDisplayMode(windType);
  264.  
  265.   if (tkInitWindow("Font Test") == GL_FALSE) {
  266.     tkQuit();
  267.   }
  268.  
  269.   Init();
  270.  
  271.   tkExposeFunc(Reshape);
  272.   tkReshapeFunc(Reshape);
  273.   tkKeyDownFunc(Key);
  274.   tkDisplayFunc(Draw);
  275.   tkExec();
  276. }
  277.